// #include<stdio.h>
// #include<time.h>
// #include<iostream>
// #include<chrono>
// #include<random>
// #include<string>
// #include<sstream>
// #include <iomanip>
// #include<atomic>

// #define LDBG 0
// #define LINF 1
// #define LERR 2

// #define LDEFAULT LDBG

// #define LOG(level, format, ...){\
//     if(level >= LDEFAULT){\
//         time_t t = time(NULL);\
//         struct tm* lt = localtime(&t);\
//         char time_tmp[32] = {0};\
//         strftime(time_tmp, 31, "%m-%d %T", lt);\
//         printf("[%s][%s:%d] " format "\n", time_tmp, __FILE__, __LINE__, ##__VA_ARGS__); \
//     }\
// }

// #define DLOG(format, ...) LOG(LDBG, format, ##__VA_ARGS__);
// #define ILOG(format, ...) LOG(LINF, format, ##__VA_ARGS__);
// #define ELOG(format, ...) LOG(LERR, format, ##__VA_ARGS__);

// std::string uuid()
// {
//     std::stringstream ss;
//     //构造一个机器随机数对象
//     std::random_device rd;
//     //以机器随机数为种子构造伪随机数对象
//     std::mt19937 generator(rd());
//     //构造限定数据范围对象
//     std::uniform_int_distribution<int> distribution(0, 255);
//     //生成八个随机数，按照特定格式组织成为16进制数字字符的字符串
//     for(int i = 0; i < 8; i++)
//     {
//         if(i == 4 || i == 6)
//             ss << "-";
//         ss << std::setw(2) << std::setfill('0') << std::hex << distribution(generator);
//     }
//     ss << "-";
//     //生成一个8字节序号，逐字节组织成为16进制数字字符的字符串
//     static std::atomic<size_t> seq(1);
//     size_t cur = seq.fetch_add(1);
//     for(int i = 7; i >= 0; i--)
//     {
//         if(i == 5) ss << "-";
//         ss << std::setw(2) << std::setfill('0') << std::hex << ((cur >> (i * 8)) & 0xFF);
//     }

//     return ss.str();
// }

// int main()
// {
//     //测试日志
//     // DLOG("%s", "hello");

//     std::cout << uuid() << std::endl;

//     return 0;
// }

#include"message.hpp"

int main()
{
    // bitrpc::BaseMessage::ptr rrp = bitrpc::MessageFactory::create<bitrpc::RpcRequest>();
    // bitrpc::RpcRequest::ptr rrp = bitrpc::MessageFactory::create<bitrpc::RpcRequest>();
    // Json::Value param;
    // param["num1"] = 11;
    // param["num2"] = 22;
    // rrp->setMethod("Add");
    // rrp->setParams(param);
    // std::string str = rrp->serialize();
    // std::cout << str << std::endl;

    // bitrpc::BaseMessage::ptr bmp = bitrpc::MessageFactory::create(bitrpc::MType::REQ_RPC);
    // bool ret = bmp->unserialize(str);
    // if(ret == false)
    //     return -1;

    // ret = bmp->check();
    // if(ret == false)
    //     return -1;

    // bitrpc::RpcRequest::ptr rrp2 = std::dynamic_pointer_cast<bitrpc::RpcRequest>(bmp);
    // std::cout << rrp->method() << std::endl;
    // std::cout << rrp->params()["num1"].asInt() << std::endl;
    // std::cout << rrp->params()["num2"].asInt() << std::endl;
    
    bitrpc::TopicRequest::ptr trp = bitrpc::MessageFactory::create<bitrpc::TopicRequest>();
    trp->setTopicKey("news");
    trp->setOptype(bitrpc::TopicOptype::TOPIC_PUBLISH);
    trp->setTopicMsg("hello world");
    std::string str = trp->serialize();
    std::cout << str << std::endl;

    bitrpc::BaseMessage::ptr bmp = bitrpc::MessageFactory::create(bitrpc::MType::REQ_TOPIC);
    bool ret = bmp->unserialize(str);
    if(ret == false) return -1;
    ret = bmp->check();
    if(ret == false) return -1;
    bitrpc::TopicRequest::ptr trp2 = std::dynamic_pointer_cast<bitrpc::TopicRequest>(bmp);
    std::cout << trp2->topicKey() << std::endl;
    std::cout << (int)trp2->optype() << std::endl;
    std::cout << trp2->topicMsg() << std::endl;

    return 0;
}







